import math
## 平面坐标根据两坐标计算位移角度与角色根据屏幕宽度大小所需转动角度
class RotationCalculator:
    def __init__(self, screen_width=1920, max_angle=180):
        """
        初始化旋转计算器
        :param screen_width: 屏幕宽度（默认1920）
        :param max_angle: 最大旋转角度（默认180度，即左右各90度）
        """
        self.screen_width = screen_width
        self.max_angle = max_angle

    def calculate_rotation(self, x1, y1, x2, y2):
        """
        计算从 (x1, y1) 到 (x2, y2) 的旋转角度（相对于北方）和屏幕像素移动量
        :param x1, y1: 当前坐标
        :param x2, y2: 目标坐标
        :return: (angle_from_north, pixels_to_rotate)
            - angle_from_north: 相对于北方的角度（0~360度）
            - pixels_to_rotate: 屏幕需要旋转的像素数（左负右正）
        """
        # 计算坐标差值（北方是Y减少的方向）
        dx = x2 - x1
        dy = y1 - y2  # 注意：y1 - y2，因为北方是Y减少的方向

        # 计算角度（使用atan2，相对于东方）
        angle_rad = math.atan2(dy, dx)
        angle_deg = math.degrees(angle_rad)

        # 转换为相对于北方的角度（北方为0度，东方为90度）
        angle_from_north = (90 - angle_deg) % 360

        # 计算屏幕旋转的像素数（假设屏幕中心为0，左右各半屏）
        pixels_to_rotate = (angle_from_north / self.max_angle) * (self.screen_width / 2)

        return angle_from_north, pixels_to_rotate


# ===== 使用示例 =====
if __name__ == "__main__":
    calculator = RotationCalculator()

    # 示例1：面向北方（Y减少的方向）
    x1, y1 = 5000, 5000
    x2, y2 = 5000, 0  # 北方
    angle, pixels = calculator.calculate_rotation(x1, y1, x2, y2)
    print(f"角度相对于北方: {angle} 度")  # 应输出 0.0
    print(f"屏幕需要旋转的像素数: {pixels} 像素")  # 应输出 0.0

    # 示例2：面向东方（X增加的方向）
    x2, y2 = 10000, 5000  # 东方
    angle, pixels = calculator.calculate_rotation(x1, y1, x2, y2)
    print(f"角度相对于北方: {angle} 度")  # 应输出 90.0
    print(f"屏幕需要旋转的像素数: {pixels} 像素")  # 应输出 480.0

    # 示例3：面向西方（X减少的方向）
    x2, y2 = 0, 5000  # 西方
    angle, pixels = calculator.calculate_rotation(x1, y1, x2, y2)
    print(f"角度相对于北方: {angle} 度")  # 应输出 270.0
    print(f"屏幕需要旋转的像素数: {pixels} 像素")  # 应输出 -480.0（左转）